package com.wuseguang.springcloud.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.UploadFileRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

/**
 * oss 断点上传 最大文件上传48T
 */
public class UploadSample {

    static Logger logger = LoggerFactory.getLogger(CallbackSample.class);

    // Endpoint以杭州为例，其它Region请按实际情况填写。
   private static String endpoint = "http://oss-cn-shenzhen.aliyuncs.com";
    // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建RAM账号。
    private static String accessKeyId = "LTAI4FjvWoR8TxMjL1Czqpim";
    private static String accessKeySecret = "74HnMNhIFixDpJzT8tWrCGpFjSium1";
    // Bucket命名规范如下：只能包括小写字母，数字和短横线（-），必须以小写字母或者数字开头，长度必须在3-63字节之间。
    private static String bucketName = "yguo";


    public static  String saveFile(MultipartFile file, String schoolId , int type){

        //获取图片名字
        String fileKey = "";
        //判断文件类型
        if(type==1){
            logger.info("图片信息存储");
            fileKey = schoolId+"/picture/"+UUIDGenerator.getUUID()+file.getOriginalFilename();
        }else if(type==2){
            logger.info("文本存储");
            fileKey = schoolId+"/file/"+UUIDGenerator.getUUID()+file.getOriginalFilename();
        }else if(type==3){
            logger.info("人脸图片存储");
            fileKey = schoolId+"/face/"+UUIDGenerator.getUUID()+file.getOriginalFilename();
        }else if(type==4){
            logger.info("视频存储");
            fileKey = schoolId+"/video/"+UUIDGenerator.getUUID()+file.getOriginalFilename();
        }else{
            logger.info("班牌版本存储");
            fileKey = schoolId+"/banCard/"+UUIDGenerator.getUUID()+file.getOriginalFilename();
        }

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        ObjectMetadata meta = new ObjectMetadata();
        // 指定上传的内容类型。
        meta.setContentType("text/plain");

        // 通过UploadFileRequest设置多个参数。
        UploadFileRequest uploadFileRequest = new UploadFileRequest(bucketName,fileKey);

        // 通过UploadFileRequest设置单个参数。
        // 设置存储空间名称。
        //uploadFileRequest.setBucketName("<yourBucketName>");
        // 设置文件名称。
        //uploadFileRequest.setKey("<yourObjectName>");
        // 指定上传的本地文件。
        uploadFileRequest.setUploadFile(FileUtil.MultipartFileToFile(file).getPath());
        // 指定上传并发线程数，默认为1。
        uploadFileRequest.setTaskNum(5);
        // 指定上传的分片大小，范围为100KB~5GB，默认为文件大小/10000。
        uploadFileRequest.setPartSize(1 * 1024 * 1024);
        // 开启断点续传，默认关闭。
        uploadFileRequest.setEnableCheckpoint(true);
        // 记录本地分片上传结果的文件。开启断点续传功能时需要设置此参数，上传过程中的进度信息会保存在该文件中，如果某一分片上传失败，再次上传时会根据文件中记录的点继续上传。上传完成后，该文件会被删除。默认与待上传的本地文件同目录，为uploadFile.ucp。
        uploadFileRequest.setCheckpointFile("uploadFile.ucp");
        // 文件的元数据。
        uploadFileRequest.setObjectMetadata(meta);
        // 设置上传成功回调，参数为Callback类型。
        //uploadFileRequest.setCallback("<yourCallbackEvent>");

        // 断点续传上传。
        try {
            ossClient.uploadFile(uploadFileRequest);
        } catch (Throwable throwable) {
            logger.error("图片上传失败 e",throwable);
            return "error";
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
        }


        return "http://www.yuguozhijia.online/"+fileKey;
    }
}
